package com.test.springai.controller;

import java.time.LocalDateTime;
import java.util.List;
import java.util.Map;
import org.springframework.ai.chat.client.ChatClient;
import org.springframework.ai.chat.messages.Message;
import org.springframework.ai.chat.messages.UserMessage;
import org.springframework.ai.chat.model.ChatModel;
import org.springframework.ai.chat.prompt.Prompt;
import org.springframework.ai.chat.prompt.SystemPromptTemplate;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.http.MediaType;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RequestParam;
import org.springframework.web.bind.annotation.RestController;

/**
 * Created with IntelliJ IDEA.
 *
 * @description:
 * @author: liuziyang
 * @since: 8/19/25 10:33 AM
 * @modifiedBy:
 * @version: 1.0
 */
@RestController
public class FunctionController {
  private static final String SYSTEM_PROMPT =
      """
            你是查询热跟账户股票信息的代理。
            你能够支持通过账号account和密钥key获取个人股票账户信息，其余功能将在后续版本中添加。如果用户问的问题不支持请告知详情。
            在进行股票帐号信息查询操作之前，你必须从用户处获取如下信息：账号account和密钥key。
            请调用自定义函数执行查询股票账户信息操作。
            返回信息包含个人帐户的股票名称name、股票代码code、股票价格price、股票数量value
            请讲中文。
            当前时间: {time}
            """;
  @Autowired private ChatModel chatModel;

  @GetMapping(value = "/chat", produces = MediaType.APPLICATION_JSON_VALUE)
  public String ragJsonText(@RequestParam(value = "userMessage") String userMessage) {
    // 这里可以调用相应的服务来处理查询
    return ChatClient.builder(chatModel)
        .build()
        .prompt()
        .system(
            """
            你是算数计算器的代理。
            你能够支持加法运算、乘法运算等操作，其余功能将在后续版本中添加。如果用户问的问题不支持请告知详情。
            在提供加法运算、乘法运算等操作之前，你必须从用户处获取如下信息：两个数字，运算类型。
            请调用自定义函数执行加法运算、乘法运算。
            请讲中文。
            """)
        .user(userMessage)
        .functions("addFunction", "mulFunction")
        .call()
        .content();
  }

  @GetMapping(value = "/ai/stock", produces = "text/html;charset=UTF-8")
  public String generateResponse(@RequestParam("userInput") String userInput) {
    // 构建系统提示词
    // 使用SystemPromptTemplate结合当前时间创建系统消息
    SystemPromptTemplate systemPromptTemplate = new SystemPromptTemplate(SYSTEM_PROMPT);
    Message systemMessage =
        systemPromptTemplate.createMessage(Map.of("time", LocalDateTime.now().toString()));
    // 构建用户消息
    // 创建包含用户输入的UserMessage
    UserMessage userMessage = new UserMessage(userInput);
    // 构建完整的prompt
    // 将系统消息和用户消息组合成prompt
    Prompt prompt = new Prompt(List.of(systemMessage, userMessage));
    // 调用ChatClient构建请求链
    return ChatClient.builder(chatModel)
        .build()
        .prompt(prompt)
        .functions("stockFunction")
        .call()
        .content();
  }
}
